#include "stm32f1xx_hal.h"
#include "bsp_uart.h"

/**
  * @defgroup BSP_UART
  * @brief 串口操作
  *
  *  初始化串口，按照通信协议传输数据到上位机。
  * @{
  */


USART_HandleTypeDef UartHandle;/**< 串口操作句柄 */

/** \brief 初始化串口
 *
 * \param baudrate 指定串口的波特率
 * \return void
 */
void BSP_UART_Init(uint32_t baudrate)
{
    GPIO_InitTypeDef gpio_initstruct;

    /* 开启时钟域 */
    UART_CLKEABLE();
    UART_PORT_CLKEABLE();

    /* 端口配置 */
    gpio_initstruct.Speed       = GPIO_SPEED_FREQ_HIGH;
    gpio_initstruct.Pin         = UART_PIN_TX;
    gpio_initstruct.Mode        = GPIO_MODE_AF_PP;
    HAL_GPIO_Init(UART_PIN_PORT, &gpio_initstruct);

    gpio_initstruct.Pin         = UART_PIN_RX;
    gpio_initstruct.Mode        = GPIO_MODE_AF_INPUT;
    HAL_GPIO_Init(UART_PIN_PORT, &gpio_initstruct);

    /* USART配置 */
    UartHandle.Init.BaudRate    = baudrate;
    UartHandle.Init.WordLength  = USART_WORDLENGTH_8B;
    UartHandle.Init.StopBits    = USART_STOPBITS_1;
    UartHandle.Init.Parity      = USART_PARITY_NONE;
    UartHandle.Init.Mode        = USART_MODE_TX_RX;
    UartHandle.Instance         = UARTX;
    HAL_USART_Init(&UartHandle);
}




/** \brief 用于重定向字符输出
 *
 * \param ch 要输出的字符
 * \return 返回传入的参数
 *
 */
int __retarget__io_putchar(int ch)
{
    HAL_USART_Transmit(&UartHandle, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
    return ch;
}



#ifdef __CC_ARM
int fputc(int ch, FILE *f)
#else
int __io_putchar(int ch)
#endif /* __CC_ARM */
{
  return __retarget__io_putchar(ch);
}

/**
  * @}
  */

